#ifndef _IPC_MQTT_COMMON_H_
#define _IPC_MQTT_COMMON_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pthread.h>
#include "mqtt_config.h"
#include "mqtt_log.h"
#include "mqttclient.h"
#include "OSC_cJSON.h"
#include "InCommon.h"

typedef struct
{
    mqtt_qos_t qos;        // QOS等级
    mqtt_client_t *client; // MQTT句柄
    int DevChn;            // 设备通道号，默认为0
    char *MsgID;           // 消息编号
    char *Cmd;             // 指令名称
    OSC_cJSON *Data;       // 协议中的Data数据
} StIpcMqttComPublishInfo, *pStIpcMqttComPublishInfo;

typedef struct
{
    Com_u32 index;    // 信息序列
    Com_ps8 mqtt_cmd; // 命令名称
} StIpcMqttComCmdInfo, *pStIpcMqttComCmdInfo;

// 属性
typedef enum
{
    IPC_MQTT_PROPERTY_POSTVERINFO = 0, // 上报版本信息（只读）
    IPC_MQTT_PROPERTY_DEVINFO,         // 设备信息（读写）
    IPC_MQTT_PROPERTY_NETINFO,         // 网络地址（读写）
    IPC_MQTT_PROPERTY_DEVTIME,         // 时间（读写）
    IPC_MQTT_PROPERTY_VIDEOENCODE,     // 视频编码模式（读写）
    IPC_MQTT_PROPERTY_ISPPARAM,        // 图像参数（读写）
    IPC_MQTT_PROPERTY_RECORDCHN,       // 录像通道（读写）
    IPC_MQTT_PROPERTY_OSDMODE,         // OSD模式（读写）
    IPC_MQTT_PROPERTY_CUSTOMOSD,       // 自定义OSD（读写）
    IPC_MQTT_PROPERTY_GB28181PARAM,    // GB28181平台参数（读写）
    IPC_MQTT_PROPERTY_CRUISEDATA,      // 巡航数据读取（读写）
    IPC_MQTT_PROPERTY_POSTTFINFO,      // TF卡信息（只读）
    IPC_MQTT_PROPERTY_TIMINGSNAPSHOT,  // 定时抓拍（读写）
    IPC_MQTT_PROPERTY_MAX,
} EnIpcMqttPropertyIndex;

typedef struct
{
    Com_s8 BottomVer[36]; // 底座摄像头版本号，最大32字节
    Com_s8 PtzVer[36];    // 云台摄像头版本号，最大32字节
    Com_s8 McuVer[36];    // MCU版本号，最大32字节
} StIpcMqttPostVerInfo, *pStIpcMqttPostVerInfo;

typedef struct
{
    Com_s8 ProductID[36];   // 产品ID，最大32字节
    Com_s8 DeviceNum[36];   // 产品名称，最大32字节
    Com_s8 ProductType[36]; // 产品类型，最大32字节
} StIpcMqttDevInfo, *pStIpcMqttDevInfo;

typedef struct
{
    Com_s32 DHCPMode;    // 0：静态IP， 1：动态，默认值为0
    Com_s8 DevIP[36];    // IP地址（DHCPMode为1时无效），默认值为"192.168.1.100"
    Com_s8 Netmask[36];  // 网络掩码（DHCPMode为1时无效），默认值为"255.255.255.0"
    Com_s8 Gateway[36];  // 网关地址（DHCPMode为1时无效），默认值为"192.168.1.1"
    Com_s8 ServerIP[36]; // 服务器地址，默认值为"192.168.1.88"
    Com_s32 Port;        // 端口，默认值为1883
    Com_s32 S_4G;        // 4G模式开关，0：关闭，1：打开，默认为0
} StIpcMqttNetInfo, *pStIpcMqttNetInfo;

typedef enum
{
    VIDEOENCODE_RESOLUTION_1280X720 = 0,
    VIDEOENCODE_RESOLUTION_1920X1080,
    VIDEOENCODE_RESOLUTION_2560X1440,
    VIDEOENCODE_RESOLUTION_2688X1520,
}EnIpcMqttVideoEncodeResolution;

typedef enum
{
    VIDEOENCODE_RCMODE_CBR = 0,
    VIDEOENCODE_RCMODE_VBR,
}EnIpcMqttVideoEncodeRcMode;

typedef struct
{
    Com_s8 Resolution[16]; // 分辨率设置，默认值为"1920x1080"，目前范围："2688x1520","2560x1440","1920x1080","1280x720"
    Com_s32 Fps;           // 帧率，范围为 1-30 帧，默认值为15
    Com_s32 Gop;           // I帧间隔，1~200可设置，默认值为30
    Com_s32 Encode;        // 编码格式，0：H264，1：H265，2：MJPEG，默认值为0
    Com_s32 RcMode;        // 码率类型，0：CBR，1：VBR，默认值为0
} StIpcMqttVideoEncode, *pStIpcMqttVideoEncode;

typedef enum
{
    ISPPARAM_VIDEOMODE_AUTO = 0,
    ISPPARAM_VIDEOMODE_DAY,
    ISPPARAM_VIDEOMODE_NIGHT,
    ISPPARAM_VIDEOMODE_TIMING,
}EnIpcMqttIspParamVideoMode;

typedef struct
{
    Com_s32 ColorMode;        // 色彩模式，0：彩色，1：黑白，默认值为0
    Com_s32 Luma;             // 亮度， 范围为0-100，默认值为50
    Com_s32 Contrast;         // 对比度，范围为0-100，默认值为50
    Com_s32 Saturation;       // 饱和度，范围为0-100，默认值为50
    Com_s32 GainCtrl;         // 增益控制，0：自动，1：手动，默认值为0
    Com_s32 Denoise;          // 降噪，0：2D，1：3D，信噪比＞55dB，默认值为0
    Com_s32 WB;               // 白平衡，0：自动，1：手动，默认值为0
    Com_s32 DEFOG;            // 透雾，0：关闭，1：电子透雾，2：光学透雾，默认值为0
    Com_s32 BLC;              // 背光补偿，0：关闭，1：开启，默认值为0
    Com_s32 Dynamic;          // 宽动态，0：关闭；1：开启，动态范围＞42dB，默认值为0
    Com_s32 HSBLC;            // 强光抑制，0：关闭，1：开启，默认值为0
    Com_s32 VideoMode;        // 日夜切换，0：自动；1：白天；2：晚上，3：定时（时间key为NightModeTime），默认值为0
    Com_s8 NightModeTime[16]; // 定时夜晚模式的时间（转换为秒，可跨天），默认值为"64800-28800"
    Com_s32 Focus;            // 聚焦模式，1：自动，2：半自动，默认值为1
} StIpcMqttIspParam, *pStIpcMqttIspParam;

typedef enum
{
    OSDMODE_POSITION_UPLEFT = 1,
    OSDMODE_POSITION_UPRIGHT,
    OSDMODE_POSITION_BOTTOMLEFT,
    OSDMODE_POSITION_BOTTOMRIGHT,
}EnIpcMqttOSDModePosition;

typedef struct
{
    Com_s32 Position;            // 整体位置，1：左上，2：右上，3：左下，4：右下，默认值为1
    Com_s32 TimeShow;            // 显示时间（格式为年-月-日 时:分:秒），0 ：不显示；1：显示，默认值为1
    Com_s32 VoltageShow;         // 显示电压，0：不显示；1：显示，默认值为1
    Com_s8 VoltageInfo[16];      // 电压信息，默认值为"18V"
    Com_s32 BDShow;              // 显示北斗信息，0：不显示；1：显示，默认值为1
    Com_s8 BDInfo[64];           // 北斗信息，默认值为"BDS0.0,0.0"
    Com_s32 MicroclimateShow;    // 显示微气象，0：不显示；1：显示，默认值为0
    Com_s8 HumitureInfo[256];    // 微气象温湿度信息，默认值为"湿度57.9% 温度27.7C"
    Com_s8 WDIRInfo[256];        // 微气象风向信息，默认值为"风速0.57ms 东风"
    Com_s8 AirPressureInfo[256]; // 微气象气压信息，默认值为"气压1005.03hPa"
} StIpcMqttOSDMode, *pStIpcMqttOSDMode;

typedef struct
{
    Com_s32 StrShow;    // 显示自定义内容，0：不显示；1：显示，默认值为0
    Com_s8 StrInfo[32]; // 自定义内容，默认值为"ZKKC"
} StIpcMqttOsdCustomInfo, *pStIpcMqttOsdCustomInfo;

typedef struct
{
    Com_s32 Position;                   // 整体位置，1：左上，2：右上，3：左下，4：右下，默认值为3
    Com_s32 ChnNameShow;                // 显示通道名称，0：不显示；1：显示，默认值为0
    Com_s8 ChnNameInfo[32];             // 通道名称，默认值为"IPCam"，最大字节为32
    pStIpcMqttOsdCustomInfo CustomInfo; // 自定义信息内容，最大为4组
} StIpcMqttCustomOSD, *pStIpcMqttCustomOSD;

typedef struct
{
    Com_s32 Status;       // 0：关闭；1：开启；默认值为0
    Com_s8 ServerIP[36];  // SIP服务器地址，默认值为"120.79.132.29"
    Com_s32 Port;         // SIP服务器端口，默认值为5060
    Com_s8 SIPID[36];     // SIP服务器ID，默认值为"34020000002000000001"
    Com_s8 SIPDomain[36]; // SIP服务器域，默认值为"3402000000"
    Com_s8 DevID[36];     // 用户认证ID，默认值为"34020000001110000001"
    Com_s8 DevName[36];   // 用户名，默认值为"admin"
    Com_s8 Password[36];  // 密码，默认值为"admin"
    Com_s32 Protocol;     // 传输协议，0：TCP，1：UDP，默认值为0
    Com_s32 RegExpires;   // 注册有效期（单位：秒），默认值为3600
    Com_s32 Heartbeat;    // 心跳周期（单位：秒），默认值为30
    Com_s32 HeartbeatCnt; // 最大心跳超时次数，默认值为3
    Com_s8 Cid[36];       // 视频通道编码ID，默认值为"34020000001310000001"
} StIpcMqttGB28181Param, *pStIpcMqttGB28181Param;

typedef struct
{
    Com_s32 CruisePointFlag; // 巡航点有效标志 ，0：无效；1：有效
    Com_s32 CruisePreset;    // 巡航点对应的预置点，取值范围[1,300]
    Com_s32 CruiseSpeed;     // 巡航点的速度，取值范围[1,8]
    Com_s32 CruiseTime;      // 巡航点停留的时间，取值范围[1,255]
} StIpcMqttCruiseInfo, *pStIpcMqttCruiseInfo;

typedef struct
{
    Com_s32 CruiseIndex;             // 巡航路线序列号，范围[1,8]
    Com_s32 CruiseFlag;              // 巡航路线标志，0：无效；1：有效
    pStIpcMqttCruiseInfo CruiseInfo; // 巡航点信息内容，最大为32组
} StIpcMqttCruiseData, *pStIpcMqttCruiseData;

typedef struct
{
    Com_s32 Total;     // 容量（单位M），无卡时默认值为0
    Com_s32 FreeSpace; // 剩余空间（单位M），无卡时默认值为0
} StIpcMqttPostTFInfo, *pStIpcMqttPostTFInfo;

typedef struct
{
    Com_s32 Hour;      // 小时，范围值为[0-23]
    Com_s32 Minute;    // 分钟，范围值为[0-59]
    Com_s32 PresetNum; // 预置位号（为0时代表当前位置），默认值为0
} StIpcMqttTimingInfo, *pStIpcMqttTimingInfo;

typedef struct
{
    pStIpcMqttTimingInfo TimingInfo; // 定时信息，最大为255组
} StIpcMqttTimingSnapshot, *pStIpcMqttTimingSnapshot;

// 服务
typedef enum
{
    IPC_MQTT_SERVICE_PTZCTRL = 0,    // 云台控制（同步）
    IPC_MQTT_SERVICE_PTZPRESET,      // 云台预置位（异步）（调用预置位结果由事件上报，上报预置位调用结果）
    IPC_MQTT_SERVICE_PTZCRUISE,      // 云台巡航（异步）（巡航结束结果由事件上报，上报巡航结果）
    IPC_MQTT_SERVICE_3DPOS,          // 3D定位操作（同步）
    IPC_MQTT_SERVICE_MANUALSNAPSHOT, // 手动抓拍（异步）（图片上传结果由事件上报，上报图片结果）
    IPC_MQTT_SERVICE_REBOOT,         // 重启命令（同步）
    IPC_MQTT_SERVICE_MEDIALIVE,      // 音视频播放（同步）
    IPC_MQTT_SERVICE_TFUSE,          // TF卡使用（异步）（TF卡状态结果由事件上报，上报TF卡状态结果）
    IPC_MQTT_SERVICE_OTA,            // 升级命令（异步）（升级结果由事件上报，上报TF卡状态结果）
    IPC_MQTT_SERVICE_MAX,
} EnIpcMqttServiceIndex;

typedef enum
{
    IPC_MQTT_PTZCMD_LIGHT_PWRON = 2, // 接通灯光电源
    IPC_MQTT_PTZCMD_WIPER_PWRON,     // 接通雨刷开关
    IPC_MQTT_PTZCMD_FAN_PWRON,       // 接通风扇开关
    IPC_MQTT_PTZCMD_HEATER_PWRON,    // 接通加热器开关
    IPC_MQTT_PTZCMD_AUX_PWRON1,      // 接通辅助设备开关
    IPC_MQTT_PTZCMD_AUX_PWRON2,      // 接通辅助设备开关
    IPC_MQTT_PTZCMD_ZOOM_IN = 11,    // 焦距变大(倍率变大)
    IPC_MQTT_PTZCMD_ZOOM_OUT,        // 焦距变小(倍率变小)
    IPC_MQTT_PTZCMD_FOCUS_NEAR,      // 焦点前调
    IPC_MQTT_PTZCMD_FOCUS_FAR,       // 焦点后调
    IPC_MQTT_PTZCMD_IRIS_OPEN,       // 光圈扩大
    IPC_MQTT_PTZCMD_IRIS_CLOSE,      // 光圈缩小
    IPC_MQTT_PTZCMD_TILT_UP = 21,    // 云台上仰
    IPC_MQTT_PTZCMD_TILT_DOWN,       // 云台下俯
    IPC_MQTT_PTZCMD_PAN_LEFT,        // 云台左转
    IPC_MQTT_PTZCMD_PAN_RIGHT,       // 云台右转
    IPC_MQTT_PTZCMD_UP_LEFT,         // 云台上仰和左转
    IPC_MQTT_PTZCMD_UP_RIGHT,        // 云台上仰和右转
    IPC_MQTT_PTZCMD_DOWN_LEFT,       // 云台下俯和左转
    IPC_MQTT_PTZCMD_DOWN_RIGHT,      // 云台下俯和右转
    IPC_MQTT_PTZCMD_PAN_AUTO,        // 云台左右自动扫描
} EnIpcMqttPtzCmd;


// 事件
typedef enum
{
    IPC_MQTT_EVENT_PRESETRESULT = 0, // 上报预置位调用结果
    IPC_MQTT_EVENT_CRUISERESULT,     // 上报巡航结果
    IPC_MQTT_EVENT_PICRESULT,        // 上报图片结果
    IPC_MQTT_EVENT_TFSTATUSRESULT,   // 上报TF卡状态结果
    IPC_MQTT_EVENT_OTARESULT,        // 上报升级结果
    IPC_MQTT_EVENT_MAX,
} EnIpcMqttEventIndex;

typedef struct
{
    Com_s32 PresetPoints; // 预置点，取值范围[1，128]
    Com_s32 Result;       // 预置位调用结果，1：到达指定预置值
} StIpcMqttPresetResult, *pStIpcMqttPresetResult;

typedef struct
{
    Com_s32 Index;  // 巡航路线，取值范围[1-8]
    Com_s32 Result; // 巡航结果，1：巡航结束
} StIpcMqttCruiseResult, *pStIpcMqttCruiseResult;

typedef enum
{
    PICRESULT_TYPE_MANUALSNAPSHOT = 1,
    PICRESULT_TYPE_TIMINGSNAPSHOT,
    PICRESULT_TYPE_PRESETSNAPSHOT,
}EnIpcMqttPicResultType;

typedef struct
{
    Com_s32 Type;       // 抓拍图片类型，1：手动抓拍，2：定时抓拍，3：预置位抓拍
    Com_s32 PresetNum;  // 预置位号，Type为3时才有效，默认值为0
    Com_s8 PicName[64]; // 图片名称，默认值为"20250801_115934.jpg"，最大字节数为64
    Com_s32 Result;     // 图片上传结果，0：上传失败，1：上传成功
} StIpcMqttPicResult, *pStIpcMqttPicResult;

typedef enum
{
    TFSTATUSRESULT_TFCMD_MOUNT = 1,
    TFSTATUSRESULT_TFCMD_UMOUNT,
    TFSTATUSRESULT_TFCMD_FORMAT,
}EnIpcMqttTFStatusResultTFCmd;

typedef struct
{
    Com_s32 TFCmd;  // TF卡命令类型，1：挂载命令，2：卸载命令，3：格式化
    Com_s32 Result; // 图片上传结果，0：执行出错，1：正常执行
} StIpcMqttTFStatusResult, *pStIpcMqttTFStatusResult;

typedef enum
{
    OTARESULT_OTATYPE_BOTTOMCAM = 0,
    OTARESULT_OTATYPE_PTZCAM,
    OTARESULT_OTATYPE_PTZ,
}EnIpcMqttOtaResultOtaType;

typedef struct
{
    Com_s32 OtaType; // 升级类型：0：底座摄像头，1：云台摄像头，2：云台机器
    Com_s32 Result;  // 图片上传结果，0：执行出错，1：正常执行
} StIpcMqttOtaResult, *pStIpcMqttOtaResult;

typedef enum
{
    IPC_MQTT_COM_TOPIC_PROPERTY_POST = 0, // 属性-设备上报-发布数据
    IPC_MQTT_COM_TOPIC_PROPERTY_GET,      // 属性-平台下发-读取数据
    IPC_MQTT_COM_TOPIC_SERVICE_POST,      // 服务-设备上报-功能上报
    IPC_MQTT_COM_TOPIC_SERVICE_GET,       // 服务-平台下发-功能下发
    IPC_MQTT_COM_TOPIC_EVENT_POST,        // 事件-设备上报-事件上报
    IPC_MQTT_COM_TOPIC_INDEX_MAX,
} EnIpcMqttComTopicIndex;

typedef void (*IPC_MQTT_COM_HANDLER_CB)(OSC_cJSON *json_buf, pStIpcMqttComPublishInfo p_info);

typedef struct
{
    EnIpcMqttPropertyIndex id;
    IPC_MQTT_COM_HANDLER_CB handler;
} StIpcMqttPropertyHandlerInfo, *pStIpcMqttPropertyHandlerInfo;

Com_ps8 Ext_Get_g_IpcMqttTopic_Info(Com_u32 index);
pStIpcMqttComCmdInfo Ext_Get_g_IpcMqttProperty_CmdData(void);
pStIpcMqttComCmdInfo Ext_Get_g_IpcMqttService_CmdData(void);
pStIpcMqttComCmdInfo Ext_Get_g_IpcMqttEvent_CmdData(void);
void Ext_IpcMqttCom_TopicInit(void);

#ifdef __cplusplus
}
#endif

#endif

